/***************************************************
 @Name :        1196kk0
 @Time :        2025-05-26
 @Email :       2232506563@qq.com
 @Comment :     SPI初始化及发送
 @FileName :    drv_SPI.c
 @Version :     4.0
****************************************************/

#include "drv_SPI.h"

/***************************************
函数名：drv_SPI2_Config
函数功能：初始化SPI2
输入参数：无
输出参数：无
其它：
        PB12    NSS 
        PB13    SCK
        PB14    MISO
        PB15    MOSI
****************************************/
void drv_SPI2_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    SPI_InitTypeDef SPI_InitStruct;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 , ENABLE);

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB , &GPIO_InitStruct);

    //配置复用
    GPIO_PinAFConfig(GPIOB , GPIO_PinSource13 , GPIO_AF_SPI2);
    GPIO_PinAFConfig(GPIOB , GPIO_PinSource14 , GPIO_AF_SPI2);
    GPIO_PinAFConfig(GPIOB , GPIO_PinSource15 , GPIO_AF_SPI2);

    //配置片选线NSS
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
    GPIO_Init(GPIOB , &GPIO_InitStruct);

    //配置SPI
    SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //SPI时钟分频
    SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;                       //第2个边沿采样
    SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;                        //时钟线空闲时为高
    SPI_InitStruct.SPI_CRCPolynomial = 7;                           //CRC校验
    SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;                  //数据位
    SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全双工
    SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;                 //数据高位先行
    SPI_InitStruct.SPI_Mode = SPI_Mode_Master;                      //主机模式
    SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;                          //片选由软件控制

    SPI_Init(SPI2 , &SPI_InitStruct);
    SPI_Cmd(SPI2 , ENABLE);
    GPIO_SetBits(GPIOB , GPIO_Pin_12);
}

/***************************************
函数名：drv_SPI2_sendData
函数功能：SPI2发送数据
输入参数：发送的数据 data
输出参数：无
其它：
****************************************/
void drv_SPI2_sendData(uint8_t data)
{
    while(SPI_I2S_GetFlagStatus(SPI2 , SPI_I2S_FLAG_TXE) == RESET); //等待上次数据发送完成后再发送新数据
    SPI_I2S_SendData(SPI2 , data);
}








